package programmteile;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;

public class Passworteingabe extends JPanel implements ActionListener {
	private static String OK = "ok";
	private static String Hilfe = "hilfe";

	private JFrame controllingFrame;
	private JPasswordField passwordField;

	public Passworteingabe(JFrame f) {
		// default FlowLayout.
		controllingFrame = f;

		passwordField = new JPasswordField(10);
		passwordField.setActionCommand(OK);
		passwordField.addActionListener(this);

		JLabel label = new JLabel("Bitte Passwort eingeben: ");
		label.setLabelFor(passwordField);

		JComponent buttonPane = createButtonPanel();

		JPanel textPane = new JPanel(new FlowLayout(FlowLayout.TRAILING));
		textPane.add(label);
		textPane.add(passwordField);

		add(textPane);
		add(buttonPane);
	}

	protected JComponent createButtonPanel() {
		JPanel p = new JPanel(new GridLayout(0, 1));
		JButton okButton = new JButton("OK");
		JButton helpButton = new JButton("Hilfe");

		okButton.setActionCommand(OK);
		helpButton.setActionCommand(Hilfe);
		okButton.addActionListener(this);
		helpButton.addActionListener(this);

		p.add(okButton);
		p.add(helpButton);

		return p;
	}

	public void actionPerformed(ActionEvent e) {
		String cmd = e.getActionCommand();

		// Passwortabfrage mit if/else

		if (OK.equals(cmd)) {
			char[] input = passwordField.getPassword();
			if (isPasswordCorrect(input)) {
				JOptionPane.showMessageDialog(controllingFrame,
						"Willkommen in der Matrix");
			} else {
				JOptionPane
						.showMessageDialog(
								controllingFrame,
								"Falsches Passwort. Sie haben 10 Sekunden das Passwort erneut einzugeben. Sonst folgt die Selbstzerst�rung",
								"Fehlermeldung", JOptionPane.ERROR_MESSAGE);
			}

			// Keine Null, aus Sicherheitsgr�nden
			Arrays.fill(input, '0');

			passwordField.selectAll();
			resetFocus();
			// f�r den Hilfe-Fall

		} else {
			JOptionPane.showMessageDialog(controllingFrame,
					"Sie k�nnen das Passwort wohl nicht knacken?.\n"
							+ "Sie brauchen es garnicht weiter probieren.\n"
							+ "Das Programm wird sich nun selbst zerst�ren\n"
							+ "Have a nice Day ;-)");
		}
	}

	/**
	 * Hier wird das Eingegebene �berpr�ft. Danach sollte es wieder gel�scht
	 * werden. Allein schon aus Sicherheitsgr�nden. funktioniert aber irgendwie
	 * grad nicht
	 * 
	 * 
	 */
	private static boolean isPasswordCorrect(char[] input) {
		boolean isCorrect = true;
		char[] correctPassword = { 'S', 'k', 'y', 'f', 'a', 'l', 'l' };

		if (input.length != correctPassword.length) {
			isCorrect = false;
		} else {
			isCorrect = Arrays.equals(input, correctPassword);
		}

		Arrays.fill(correctPassword, '0');

		return isCorrect;
	}

	protected void resetFocus() {
		passwordField.requestFocusInWindow();
	}

	/**
	 * GuI
	 */
	private static void createAndShowGUI() {

		JFrame frame = new JFrame("Passworteingabe");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final Passworteingabe newContentPane = new Passworteingabe(frame);
		newContentPane.setOpaque(true);
		frame.setContentPane(newContentPane);

		frame.addWindowListener(new WindowAdapter() {
			public void windowActivated(WindowEvent e) {
				newContentPane.resetFocus();

			}
		});

		// Damit das Fenster angezeigt wird
		frame.pack();
		frame.setVisible(true);

	}

	public static void main(String[] args) {

		SwingUtilities.invokeLater(new Runnable() {
			public void run() {

				UIManager.put("swing.boldMetal", Boolean.FALSE);
				createAndShowGUI();
			}
		});
	}
}
